package com.vcredit.bird.util;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class Jmail {

    /**
     * 
     * 
     * @param senderName    发件人昵称
     * @param receiverName  收件人昵称
     * @param theme         主题、标题
     * @param picPath       图片路径
     * @param sendMail      发件人邮箱
     * @param receiveMail   收件人邮箱
     * @param myPassword    发件人邮箱密码
     * @param myEmailSMTPHost   邮箱服务器地址
     * @param content       邮件主体内容      
     * @param filePath      附件地址              d:\\report.html 
     * @param fileName      附件显示名称      征信报告.html
     * @throws Exception
     */
    public static void sendReport(String senderName, String receiverName, 
                                  String theme, String picPath, String receiveMail, 
                                  String sendMail,String myPassword,String myEmailSMTPHost,
                                  String content, 
                                  String filePath, String fileName) throws Exception{
     // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties(); // 参数配置
        props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true"); // 需要请求认证

        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getDefaultInstance(props);
        session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log

        // 3. 创建一封邮件
        MimeMessage message = createReportMessage(session, senderName, receiverName, theme, picPath, sendMail, receiveMail, content, filePath, fileName);

        // 也可以保持到本地查看
        // message.writeTo(file_out_put_stream);

        // 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();

        // 5. 使用 邮箱账号 和 密码 连接邮件服务器
        // 这里认证的邮箱必须与 message 中的发件人邮箱一致，否则报错
        transport.connect(sendMail, myPassword);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 关闭连接
        transport.close();
    }
    
    public static MimeMessage createReportMessage(Session session, String senderName, String receiverName, String theme, String picPath, String sendMail, String receiveMail, String content, String filePath, String fileName) throws Exception {
        // 1. 创建邮件对象
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人
        message.setFrom(new InternetAddress(sendMail, senderName, "UTF-8"));

        // 3. To: 收件人（可以增加多个收件人、抄送、密送）
        message.addRecipient(RecipientType.TO, new InternetAddress(receiveMail, receiverName, "UTF-8"));

        // 4. Subject: 邮件主题
        message.setSubject(theme, "UTF-8");

        /*
         * 下面是邮件内容的创建:
         */

        // 5. 创建图片“节点”
        /*MimeBodyPart image = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource(picPath)); // 读取本地文件
        image.setDataHandler(dh); // 将图片数据添加到“节点”
        image.setContentID("image_fairy_tail"); // 为“节点”设置一个唯一编号（在文本“节点”将引用该ID）
*/
        // 6. 创建文本“节点”
        MimeBodyPart text = new MimeBodyPart();
        //    这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
        //text.setContent("这是一张图片<br/><img src='cid:image_fairy_tail'/>", "text/html;charset=UTF-8");
        text.setContent(content, "text/html;charset=UTF-8");
        // 7. （文本+图片）设置 文本 和 图片 “节点”的关系（将 文本 和 图片 “节点”合成一个混合“节点”）
        MimeMultipart mm_text_image = new MimeMultipart();
        mm_text_image.addBodyPart(text);
//        mm_text_image.addBodyPart(image);
        mm_text_image.setSubType("related"); // 关联关系

        // 8. 将 文本+图片 的混合“节点”封装成一个普通“节点”
        //    最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
        //    上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
        MimeBodyPart text_image = new MimeBodyPart();
        text_image.setContent(mm_text_image);

        // 9. 创建附件“节点”
        MimeBodyPart attachment = new MimeBodyPart();
        DataHandler dh2 = new DataHandler(new FileDataSource(filePath)); // 读取本地文件
        attachment.setDataHandler(dh2); // 将附件数据添加到“节点”
        attachment.setFileName(MimeUtility.encodeText(fileName)); // 设置附件的文件名（需要编码）

        // 10. 设置（文本+图片）和 附件 的关系（合成一个大的混合“节点” / Multipart ）
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text_image);
        mm.addBodyPart(attachment); // 如果有多个附件，可以创建多个多次添加
        mm.setSubType("mixed"); // 混合关系

        // 11. 设置整个邮件的关系（将最终的混合“节点”作为邮件的内容添加到邮件对象）
        message.setContent(mm);

        // 12. 设置发件时间
        message.setSentDate(new Date());

        // 13. 保存上面的所有设置
        message.saveChanges();

        return message;
    }
    
    public static void main(String[] args) throws Exception {
        sendReport("小程序-查征信", "罗晓旭", "征信报告", "", "1790400388@qq.com","chazhengxin@vcredit.com" , "czx1234!!", "smtp.vcredit.com", 
            getHtml("http://10.1.12.84:8000/credit/query/report.aspx?reportid=100")+"<br><hr>本邮件为系统自动发送，请勿回复！！！<br><br>", 
            "d:\\report1.html", "征信报告.html");
    }

    
/* // 发件人的 邮箱 和 密码（替换为自己的邮箱和密码）
    public static String myEmailAccount  = "";
    public static String myEmailPassword = "";

    // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com
    // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
    public static String myEmailSMTPHost = "smtp.163.com";

    // 收件人邮箱（替换为自己知道的有效邮箱）
    public static String receiveMailAccount = "";*/
    
    public static String getHtml(String url){
        StringBuffer temp = new StringBuffer();  
        try {  
//            String url = "http://www.baidu.com/jiaojing/ser.PHP";  
            HttpURLConnection uc = (HttpURLConnection)new URL(url).  
                                   openConnection();  
            uc.setConnectTimeout(10000);  
            uc.setDoOutput(true);  
            uc.setRequestMethod("GET");  
            uc.setUseCaches(false);  
//            DataOutputStream out = new DataOutputStream(uc.getOutputStream());  
    
            // 要传的参数  
            /*String s = URLEncoder.encode("ra", "GB2312") + "=" +  
                       URLEncoder.encode(leibie, "GB2312");  
            s += "&" + URLEncoder.encode("keyword", "GB2312") + "=" +  
                    URLEncoder.encode(num, "GB2312");  */
            // DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写道流里面  
//            out.writeBytes(s);  
            /*out.flush();  
            out.close();  */
            InputStream in = new BufferedInputStream(uc.getInputStream());  
            Reader rd = new InputStreamReader(in, "utf-8");  
            int c = 0;  
            while ((c = rd.read()) != -1) {  
                temp.append((char) c);  
            }  
//            System.out.println(temp.toString());  
            in.close();  
    
        } catch (Exception e) {  
//            e.printStackTrace();  
        }  
        return temp.toString();  
    }
}
